#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/12/6 8:47
# @Author  : FuKai ZHANG
# @File    : logging_tools.py
# @Description :日志控制文件
from loguru import logger as loguru_logger
from typing import Text
import time
import os
from config.setting import ensure_path_sep


class LogHandler:
    """ 日志打印封装 """

    def __init__(
            self,
            filename: Text,
            level: Text,
            rotation: Text = "1 day",
            retention: Text = "7 days",
            format: Text = "{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}"
    ):
        """
        初始化日志处理器
        :param filename: 日志文件路径
        :param level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        :param rotation: 文件轮转规则 (例如 "1 day", "10 MB")
        :param retention: 日志保留时间 (例如 "7 days")
        :param format: 日志格式
        """
        # 确保日志目录存在
        log_dir = os.path.dirname(filename)
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        self.log_path = ensure_path_sep(filename)
        self.level = level.upper()

        # 添加日志处理器，设置过滤器只记录指定级别
        loguru_logger.add(
            sink=self.log_path,
            level=0,  # 设置为0以捕获所有日志，然后用filter筛选
            rotation=rotation,
            retention=retention,
            format=format,
            encoding="utf-8",
            filter=lambda record: record["level"].name == self.level
        )

    def info(self, message: Text):
        """ 记录 INFO 级别日志 """
        loguru_logger.info(message)

    def error(self, message: Text):
        """ 记录 ERROR 级别日志 """
        loguru_logger.error(message)

    def warning(self, message: Text):
        """ 记录 WARNING 级别日志 """
        loguru_logger.warning(message)

    def debug(self, message: Text):
        """ 记录 DEBUG 级别日志 """
        loguru_logger.debug(message)

    def critical(self, message: Text):
        """ 记录 CRITICAL 级别日志 """
        loguru_logger.critical(message)


# 不要移除默认处理器，避免影响其他日志配置
now_time_day = time.strftime("%Y-%m-%d", time.localtime())
INFO = LogHandler(ensure_path_sep(f"\\logs\\info-{now_time_day}.log"), level='INFO')
ERROR = LogHandler(ensure_path_sep(f"\\logs\\error-{now_time_day}.log"), level='ERROR')
WARNING = LogHandler(ensure_path_sep(f"\\logs\\warning-{now_time_day}.log"), level='WARNING')

if __name__ == '__main__':
    INFO.info("测试 INFO 日志")
    ERROR.error("测试 ERROR 日志")
    WARNING.warning("测试 WARNING 日志")